//
//  NSDateFormatter+CycleDateFormatter.m
//  CycleControlFunction
//
//  Created by ddy on 2018/8/14.
//  Copyright © 2018年 cycle. All rights reserved.
//

#import "NSDateFormatter+CycleDateFormatter.h"

@implementation NSDateFormatter (CycleDateFormatter)

static NSDateFormatter * iOS7LatercachedDateFormatter = nil;
/**
 * 初始化并缓存，默认有formatterString
 */
+ (NSDateFormatter *)cycle_cachedDateFormatter {
    if (@available(iOS 7.0,*)) {
        //在iOS 7、macOS 10.9及以上系统版本，NSDateFormatter都是线程安全的，因此我们无需担心日期格式化对象在使用过程中被另外一条线程给修改，为了提高性能，我们还可以在上述代码块中进行简化（除去冗余部分）。
        
        if (!iOS7LatercachedDateFormatter) {
            
            iOS7LatercachedDateFormatter = [[NSDateFormatter alloc] init];
            
            [iOS7LatercachedDateFormatter setLocale:[NSLocale currentLocale]];
            
            [iOS7LatercachedDateFormatter setDateFormat: @"YYYY-MM-dd HH:mm:ss"];
            
        }
        
        return iOS7LatercachedDateFormatter;
    } else {
        static NSString * const ios7BeforeKey = @"cycle_ios7beforecachedDateFormatter";
        //如果直接采用静态变量进行存储，那么可能就会存在线程安全问题，在iOS 7之前，NSDateFormatter是非线程安全的，因此可能就会有两条或以上的线程同时访问同一个日期格式化对象，从而导致App崩溃。
        NSMutableDictionary *threadDictionary = [[NSThread currentThread] threadDictionary];
        
        NSDateFormatter *dateFormatter = [threadDictionary objectForKey:ios7BeforeKey];
        
        if (!dateFormatter) {
            
            dateFormatter = [[NSDateFormatter alloc] init];
            
            [dateFormatter setLocale:[NSLocale currentLocale]];
            
            [dateFormatter setDateFormat: @"YYYY-MM-dd HH:mm:ss"];
            
            [threadDictionary setObject:dateFormatter forKey:ios7BeforeKey];
            
        }
        
        return dateFormatter;
    }
    
    
}
/**
 * 传formatterString，比如"yyyy-MM-dd HH:mm:ss"
 */
+ (NSDateFormatter *)cycle_cachedDateFormatterWithFormatString:(NSString *)formatterString {
    if (@available(iOS 7.0,*)) {
        //在iOS 7、macOS 10.9及以上系统版本，NSDateFormatter都是线程安全的，因此我们无需担心日期格式化对象在使用过程中被另外一条线程给修改，为了提高性能，我们还可以在上述代码块中进行简化（除去冗余部分）。
        
        if (!iOS7LatercachedDateFormatter) {
            
            iOS7LatercachedDateFormatter = [[NSDateFormatter alloc] init];
            
            [iOS7LatercachedDateFormatter setLocale:[NSLocale currentLocale]];
            
            [iOS7LatercachedDateFormatter setDateFormat:formatterString];
            
        }
        
        return iOS7LatercachedDateFormatter;
    } else {
        static NSString * const ios7BeforeKey = @"cycle_ios7beforecachedDateFormatter";
        //如果直接采用静态变量进行存储，那么可能就会存在线程安全问题，在iOS 7之前，NSDateFormatter是非线程安全的，因此可能就会有两条或以上的线程同时访问同一个日期格式化对象，从而导致App崩溃。
        NSMutableDictionary *threadDictionary = [[NSThread currentThread] threadDictionary];
        
        NSDateFormatter *dateFormatter = [threadDictionary objectForKey:ios7BeforeKey];
        
        if (!dateFormatter) {
            
            dateFormatter = [[NSDateFormatter alloc] init];
            
            [dateFormatter setLocale:[NSLocale currentLocale]];
            
            [dateFormatter setDateFormat:formatterString];
            
            [threadDictionary setObject:dateFormatter forKey:ios7BeforeKey];
            
        }
        
        return dateFormatter;
    }
    
    
}
@end
